package com.webserver.core;

import com.webserver.http.HttpServletRequest;
import com.webserver.http.HttpServletResponse;

import java.io.File;

/**
 * 该类用于完成请求的处理工作
 */

public class DispatcherServlet {
    /*
    单例模式 java23中设计模式之一
    当一个类仅需要一个实例时，可使用此模式.
    三个步骤：
    1：提供静态的私有的当前类的属性
    2：私有化构造方法：
    3：提供静态公开的获取当前类实例的方法
    再放放阿忠克判断步骤1的静态属性是否为null,是,则实例化对象（仅此一次）
    否则直接返回该实例
     */
    private static DispatcherServlet obj;

    private DispatcherServlet(){
    }
    public static DispatcherServlet getInstance(){
        if (obj==null){
            obj = new DispatcherServlet();
        }
        return obj;
    }
    public void service(HttpServletRequest request, HttpServletResponse response){
        String path = request.getUri();

        //将./webapps/myweb/index.html响应给浏览器
        File file = new File("./webbapps"+path);

        if (file.isFile()){//如果定位的不是文件
            response.setEntity(file);
            /*
            1：通过file获取文件名（浏览器请求的文件的名字）
            比如：img.png
            2：根据文件名可以截取处后缀部分(String的相关方法）
            比如：png
            3：根据后缀的值设置Content-Type的值
            比如：
            response.addHeader（“Content-Type”，“image/png”）
             */
            //添加两个响应头Content - Type和Content-Length
            response.addHeader("Content-Type","text/html");
            response.addHeader("Content-Length",String.valueOf(file.length()));
        }else{//不是文件（要么不存在，要么是目录，404情况）
            file = new File("./webbapps/root/505.html");
            response.setStatusCode(404);
            response.setStatusReason("NotFund");
            response.setEntity(file);
            response.addHeader("Content-Type","text/html");
            response.addHeader("Content-Length",String.valueOf(file.length()));

        }

        response.addHeader("Server","WebServer");

    }
}

